package com.zhuifeng.product.service.impl;

import java.util.ArrayList;
import java.util.List;

import com.alibaba.fastjson.JSONObject;
import com.zhuifeng.common.core.utils.DateUtils;
import com.zhuifeng.common.core.utils.snow.GuuidUtil;
import com.zhuifeng.common.security.utils.SecurityUtils;
import com.zhuifeng.product.domain.ProductRuleAttr;
import com.zhuifeng.product.domain.RuleAttrModule;
import com.zhuifeng.product.service.IProductRuleAttrService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.zhuifeng.product.mapper.ProductRuleMapper;
import com.zhuifeng.product.domain.ProductRule;
import com.zhuifeng.product.service.IProductRuleService;
import org.springframework.transaction.annotation.Transactional;

/**
 * 商品规格Service业务层处理
 *
 * @author zhuifeng
 * @date 2022-08-18
 */
@Service
public class ProductRuleServiceImpl implements IProductRuleService
{
    @Autowired
    private ProductRuleMapper productRuleMapper;

    @Autowired
    private IProductRuleAttrService productRuleAttrService;
    /**
     * 查询商品规格
     *
     * @param productRuleId 商品规格主键
     * @return 商品规格
     */
    @Override
    public ProductRule selectProductRuleByProductRuleId(String productRuleId)
    {
        return productRuleMapper.selectProductRuleByProductRuleId(productRuleId);
    }

    /**
     * 查询类型规格
     *
     * @param typeId 类型主键
     * @return 类型规格
     */
    @Override
    public ProductRule selectProductRuleByTypeId(String typeId){
        return productRuleMapper.selectProductRuleByTypeId(typeId);
    }

    /**
     * 查询商品规格列表
     *
     * @param productRule 商品规格
     * @return 商品规格
     */
    @Override
    public List<ProductRule> selectProductRuleList(ProductRule productRule)
    {

        return productRuleMapper.selectProductRuleList(productRule);
    }

    /**
     * 新增商品规格
     *
     * @param productRule 商品规格
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = {Exception.class})
    public int insertProductRule(ProductRule productRule)
    {
        long uuid = GuuidUtil.getUUID();
        String id = String.valueOf(uuid);
        productRule.setProductRuleId(id);
        productRule.setCreatedBy(SecurityUtils.getStrUserId());
        productRule.setCreatedTime(DateUtils.getNowDate());
//        批量添加
        productRuleAttrService.batchAdd(getProductRuleAttrList(productRule.getRultAttr(),uuid+""));
        return productRuleMapper.insertProductRule(productRule);
    }

    private List<ProductRuleAttr> getProductRuleAttrList(String rultAttr,String uuid) {
        List<RuleAttrModule> ruleAttrModules = JSONObject.parseArray(rultAttr, RuleAttrModule.class);
        ArrayList<ProductRuleAttr> productRuleAttrs = new ArrayList<>();
        ruleAttrModules.forEach(ruleAttrModule -> {
            String ruleAttrModuleKey = ruleAttrModule.getKey();
            ruleAttrModule.getValues().forEach(value -> {
                ProductRuleAttr productRuleAttr = new ProductRuleAttr();
                productRuleAttr.setProductRuleId(uuid);
                productRuleAttr.setProductRuleAttrId(""+GuuidUtil.getUUID());
                productRuleAttr.setName(ruleAttrModuleKey);
                productRuleAttr.setAttrValue(value);
                productRuleAttr.setCreateBy(SecurityUtils.getStrUserId());
                productRuleAttr.setCreateTime(DateUtils.getNowDate());
                productRuleAttrs.add(productRuleAttr);
            });
        });
        return productRuleAttrs;
    }

    /**
     * 修改商品规格
     *
     * @param productRule 商品规格
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = {Exception.class})
    public int updateProductRule(ProductRule productRule)
    {
        productRule.setUpdateTime(DateUtils.getNowDate());
        productRule.setUpdateBy(SecurityUtils.getStrUserId());
//        先删
        productRuleAttrService.deleteProductRuleAttrByProductRuleId(productRule.getProductRuleId());
//        后填
        productRuleAttrService.batchAdd(getProductRuleAttrList(productRule.getRultAttr(),productRule.getProductRuleId()));
        return productRuleMapper.updateProductRule(productRule);
    }

    /**
     * 批量删除商品规格
     *
     * @param productRuleIds 需要删除的商品规格主键
     * @return 结果
     */
    @Override
    public int deleteProductRuleByProductRuleIds(String[] productRuleIds)
    {
        return productRuleMapper.deleteProductRuleByProductRuleIds(productRuleIds);
    }

    /**
     * 删除商品规格信息
     *
     * @param productRuleId 商品规格主键
     * @return 结果
     */
    @Override
    public int deleteProductRuleByProductRuleId(String productRuleId)
    {
        return productRuleMapper.deleteProductRuleByProductRuleId(productRuleId);
    }
}
